package vista;

import DTOsWS.CampaignDTO;
import DTOsWS.MinimumCustomerFieldsDTO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.*;
import javax.swing.DefaultListModel;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class ElementoCampaignDTO extends Observable{
    private String txtSalida;
    private Element elementoCampaignDTO;
    private Document docCampaign=null;
    private int idMayorCampaign=0;
    private boolean nuevoCampaign=false;
    private DefaultListModel modeloListaCampaign = new DefaultListModel();  

    /**
     * @return the ElementoCampaignDTO
     */
    public Element getElementoCampaignDTO() {
        return elementoCampaignDTO;
    }

    
    /**
     * @param ElementoCampaignDTO the ElementoCampaignDTO to set
     */
    public void setElementoCampaignDTO(Element elementoCampaignDTO) {
        this.elementoCampaignDTO = elementoCampaignDTO;
    }
    
    public ElementoCampaignDTO(){
 
    }
    
    @Override
    public String toString(){
        String cad= "CampaignDTO "+this.getElementoCampaignDTO().getAttributeValue("id");
        cad+=" - "+this.getElementoCampaignDTO().getAttributeValue("descripcion");
        return cad;
    }
    
public void vaciaCamposCampaign() {
        FormDTOs a = vista.FormDTOs.getInstance();
        a.getCampoAmountDaysExpiration().setText("");
        a.getCampoAmountLastMovements().setText("");
        a.getCampoAmountPrizes().setText("");
        a.getCampoCreditsTag().setText("");
        a.getCampoDescriptionCampaign().setText("");
        a.getCampoDirLogo().setText("");
        a.getCampoNameCamp().setText("");
        a.getCampoLocalCurrencyConversion().setText("");
        a.getCampoPointsTag().setText("");
        a.getCampoTypesCards().setText("");
        a.getComentariosCampaignDTO().setText("");
}


public Element armaNuevoElementCampaign() {
    Element campDto= new Element("CampaignDTO");
    campDto.setAttribute("id",String.valueOf(getIdMayorCampaign()+1));
    campDto.setAttribute("descripcion",vista.FormDTOs.getInstance().getComentariosCampaignDTO().getText());
    Element amountDaysExpiration = new Element("amountDaysExpiration").setText(vista.FormDTOs.getInstance().getCampoAmountDaysExpiration().getText());
    campDto.addContent(amountDaysExpiration);
    
    Element amountLastMovements = new Element("amountLastMovements").setText(vista.FormDTOs.getInstance().getCampoAmountLastMovements().getText());
    campDto.addContent(amountLastMovements);

/*   un DTO adentro de otro  
    Element orders = new Element("orders");
    Element criteria = new Element("criteria").setText(vista.FormDTOs.getInstance().getCampoCriteria().getText());
    orders.addContent(criteria);
    
    Element order = new Element("order").setText(vista.FormDTOs.getInstance().getCampoOrder().getText());
    orders.addContent(order);
    campDto.addContent(orders);
*/
    
    Element amountPrizes = new Element("amountPrizes").setText(vista.FormDTOs.getInstance().getCampoAmountPrizes().getText());
    campDto.addContent(amountPrizes);
    
    Element creditsTag = new Element("creditsTag").setText(vista.FormDTOs.getInstance().getCampoCreditsTag().getText());
    campDto.addContent(creditsTag); 
    
    Element descriptionCampaign = new Element("descriptionCampaign").setText(vista.FormDTOs.getInstance().getCampoDescriptionCampaign().getText());
    campDto.addContent(descriptionCampaign); 
    
    Element dirLogo = new Element("dirLogo").setText(vista.FormDTOs.getInstance().getCampoDirLogo().getText());
    campDto.addContent(dirLogo); 
    
    Element nameCamp = new Element("nameCamp").setText(vista.FormDTOs.getInstance().getCampoNameCamp().getText());
    campDto.addContent(nameCamp); 

    Element localCurrencyConversion = new Element("localCurrencyConversion").setText(vista.FormDTOs.getInstance().getCampoLocalCurrencyConversion().getText());
    campDto.addContent(localCurrencyConversion); 
    
    Element pointsTag = new Element("pointsTag").setText(vista.FormDTOs.getInstance().getCampoPointsTag().getText());
    campDto.addContent(pointsTag); 
    
    Element typesCards = new Element("typesCards").setText(vista.FormDTOs.getInstance().getCampoTypesCards().getText());
    campDto.addContent(typesCards); 
        
    return campDto;
}
    
public boolean actualizaValoresEnDocCampaign(int idItemElegido) {
    boolean todoOk=false;
    if ((!isNuevoCampaign())&& (idItemElegido>=0)){ 
        //si no es nuevo, es porque estoy modificando alguno de los seleccionados
        Element e = obtieneCampaignElegido(idItemElegido);
        if (e != null) {
            e.setAttribute("descripcion", vista.FormDTOs.getInstance().getComentariosCampaignDTO().getText());
            e.getChild("amountDaysExpiration").setText(vista.FormDTOs.getInstance().getCampoAmountDaysExpiration().getText());
            e.getChild("amountLastMovements").setText(vista.FormDTOs.getInstance().getCampoAmountLastMovements().getText());
            e.getChild("amountPrizes").setText(vista.FormDTOs.getInstance().getCampoAmountPrizes().getText());
            e.getChild("creditsTag").setText(vista.FormDTOs.getInstance().getCampoCreditsTag().getText());        
            e.getChild("descriptionCampaign").setText(vista.FormDTOs.getInstance().getCampoDescriptionCampaign().getText());
            e.getChild("dirLogo").setText(vista.FormDTOs.getInstance().getCampoDirLogo().getText());
            e.getChild("nameCamp").setText(vista.FormDTOs.getInstance().getCampoNameCamp().getText());
            e.getChild("localCurrencyConversion").setText(vista.FormDTOs.getInstance().getCampoLocalCurrencyConversion().getText());        
            e.getChild("pointsTag").setText(vista.FormDTOs.getInstance().getCampoPointsTag().getText());
            e.getChild("typesCards").setText(vista.FormDTOs.getInstance().getCampoTypesCards().getText());                        
            todoOk=true;
        }
    }
    else
        { if (validaCamposCampaign()){
               //se arma el Element que representará el nuevo ElementoCampaignDTO
               //con los valores especificados por el usuario
               Element campaignNuevo = armaNuevoElementCampaign();  
               getDocCampaign().getRootElement().addContent(campaignNuevo);
               todoOk=true;
            }                     
        } 
    return todoOk;
}

public FileInputStream abreArchivoCampaign(String nombre) throws JDOMException{
        //Intentamos abrir el archivo, y si no existe lo creamos
        String ruta =System.getProperty("user.dir")+"\\"+nombre+"s.xml";
        FileInputStream archivo=null;
        boolean exists = (new java.io.File(ruta)).exists(); 
        if (exists) { 
            try { archivo = new FileInputStream(ruta); }
            catch (IOException e) { System.out.println(e); 
                setTxtSalida("No se pudo abrir "+ruta); 
            }
        }
        else {
            try { java.io.File file = new java.io.File(ruta);
                  // Create file if it does not exist
                  boolean success = file.createNewFile();
                  boolean sePuedeLeer = file.canRead();
                  try { archivo = new FileInputStream(ruta); 
                        // Creamos el builder basado en SAX      
                        SAXBuilder builder = new SAXBuilder();  
                        // Construimos el arbol DOM
                        //setDocCampaign(builder.build(archivo));
                        setDocCampaign(new Document());
                        // Le agregamos el root element que corresponda y lo guardamos
                        Element rootElement = new Element("Elementos"+nombre);
                        getDocCampaign().addContent(rootElement);
                        guardaXMLcampaign();
                        setDocCampaign(null);
                  }
                  catch (IOException e) { System.out.println(e); 
                      setTxtSalida("No se pudo abrir "+ruta); 
                  }
            } catch (IOException e) {
                System.out.println(e); 
                setTxtSalida("No se pudo crear "+ruta);
            }
         }
     return archivo;   
}


public DefaultListModel LeeXMLcampaign() {
    getModeloListaCampaign().clear();
    //SAXBuilder se encarga de cargar el archivo XML del disco o de un String
    // Creamos el builder basado en SAX      
    SAXBuilder builder = new SAXBuilder();  
    try {
        //abrimos el archivo
        FileInputStream archivo = abreArchivoCampaign("CampaignDTO");        
        // Construimos el arbol DOM a partir del fichero xml  y Cargamos el documento
         setDocCampaign(builder.build(archivo));
         // Obtenemos la etiqueta raíz  
         Element raiz = getDocCampaign().getRootElement();  
         // Recorremos los hijos de la etiqueta raíz  
         List<Element> hijosRaiz = raiz.getChildren();  
         for(Element elementoCampaignDTO: hijosRaiz){  
            // Obtenemos el nombre y su contenido de tipo texto  
            String nombre = elementoCampaignDTO.getName();  
            String texto = elementoCampaignDTO.getValue();       
            //System.out.println("\n Etiqueta: "+nombre+". Texto: "+texto);

            // Obtenemos el atributo id si lo hubiera
            String id = elementoCampaignDTO.getAttributeValue("id");  
            if(id!=null){  
                if (getIdMayorCampaign()<Integer.valueOf(id))
                  {     setIdMayorCampaign((int) Integer.valueOf(id)); }
                id=" id: "+id;
            }
            else { id=""; }
            // Obtenemos el atributo descripcion si lo hubiera              
            String descripcion = elementoCampaignDTO.getAttributeValue("descripcion");  
            if(descripcion!=null){  
                descripcion="- Descripcion: "+descripcion;
            }
            else { descripcion=""; } 
            ElementoCampaignDTO elemCampDto = new ElementoCampaignDTO();
            elemCampDto.setElementoCampaignDTO(elementoCampaignDTO);            
            //getModeloListaCampaign().addElement(nombre+id+descripcion);
            getModeloListaCampaign().addElement(elemCampDto);
         }   
        }catch (JDOMException ex) {
            //1todoOk=false;
            Logger.getLogger(FormDTOs.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            //1 todoOk=false;
            Logger.getLogger(FormDTOs.class.getName()).log(Level.SEVERE, null, ex);
        }       
    return getModeloListaCampaign();
}

public void guardaXMLcampaign() { //quedé acá
        // Vamos a serializar el XML. Lo primero es obtener el formato de salida  
        // Partimos del "Formato bonito", aunque también existe el plano y el compacto  
        Format format = Format.getPrettyFormat();  
        // Creamos el serializador con el formato deseado  
        XMLOutputter xmloutputter = new XMLOutputter(format);  
        // Serializamos el document parseado  
        //String docStr = xmloutputter.outputString(docCampaign);          
        try{
            String filename="CampaignDTOs.xml";
            FileOutputStream file = new FileOutputStream(filename);
            xmloutputter.output(getDocCampaign(),file);
            file.flush();
            file.close();
            //xmloutputter.output(this.pagDTO.getDocCampaign(),System.out);
            setTxtSalida("Se guardaron correctamente los cambios en el archivo "+filename);
            setNuevoCampaign(false);
            vista.FormDTOs.getInstance().leeXMLsyActualizaInterfaz();
        }catch(Exception e){
            e.printStackTrace();
            setTxtSalida("No se pudieron guardar los datos en el archivo");
        }
}

public Element obtieneCampaignElegido(int idItemElegido) {
    Element e=null;    
    boolean encontro=false;    
    if (idItemElegido>=0) {        
        Element raiz= getDocCampaign().getRootElement();
        List<Element> lista=raiz.getChildren("CampaignDTO");
        int i=0;
        while ((i<lista.size()) && (!(encontro))){
          e = lista.get(i);
          if (e.getAttributeValue("id").equals(String.valueOf(idItemElegido)))
            { encontro=true; }
          i++;
        }
    }
    if (!(encontro)){
        e=null;
    }
    return e;
}

public boolean DTOsRequeridosEstanOk() {
    
    return true;
}

public CampaignDTO elemElegido2DTO(int idItemElegido) {
    CampaignDTO campdto = null;
    Element elemElegido = obtieneCampaignElegido(idItemElegido);
    if (elemElegido != null) {
        campdto.setAmountDaysExpiration(Integer.valueOf(elemElegido.getChildText("amountDaysExpiration")));
        campdto.setAmountLastMovements(Integer.valueOf(elemElegido.getChildText("amountLastMovements")));
        campdto.setAmountPrizes(Integer.valueOf(elemElegido.getChildText("amountPrizes")));
        campdto.setCompleteCustFields(FormDTOs.getInstance().getCcfDTO().elemElegido2DTO(FormDTOs.getInstance().getIdDelItemElegidoCcf()));
        campdto.setCreditsTag(elemElegido.getChildText("creditsTag"));
        campdto.setDescription(elemElegido.getChildText("descriptionCampaign"));
        campdto.setDirLogo(elemElegido.getChildText("dirLogo"));
        campdto.setName(elemElegido.getChildText("nameCamp"));
        campdto.setMinimumCustFields(FormDTOs.getInstance().getMcfDTO().elemElegido2DTO(FormDTOs.getInstance().getIdDelItemElegidoMcf()));
        campdto.setLocalCurrencyConversion(BigDecimal.valueOf(Long.valueOf(elemElegido.getChildText("localCurrencyConversion"))));
        campdto.setPointsTag(elemElegido.getChildText("pointsTag"));
        //campdto.setShop();
        //campdto.setTerminal();
        //campdto.setTicket();
        campdto.setTypesCards(idItemElegido);                
    }
    return campdto;
}


public boolean validaCamposCampaign(){    
    //validamos los datos ingresados en ElementoCampaignDTO
    boolean noErrorCampaignDTO=true;   
    FormDTOs pantalla=FormDTOs.getInstance();
    noErrorCampaignDTO=pantalla.getCampoAmountDaysExpiration().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoAmountDaysExpiration().getText()) && (!(pantalla.getCampoAmountDaysExpiration().getText().contains("."))) && (!(pantalla.getCampoAmountDaysExpiration().getText().contains(",")));//int
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoAmountLastMovements().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoAmountLastMovements().getText())  && (!(pantalla.getCampoAmountLastMovements().getText().contains("."))) && (!(pantalla.getCampoAmountLastMovements().getText().contains(",")));//int
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoAmountPrizes().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoAmountPrizes().getText())  && (!(pantalla.getCampoAmountPrizes().getText().contains("."))) && (!(pantalla.getCampoAmountPrizes().getText().contains(",")));//int
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoCreditsTag().getText().length()>0;//string
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoDescriptionCampaign().getText().length()>0;//string
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoDirLogo().getText().length()>0;//string
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoNameCamp().getText().length()>0;//string
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoLocalCurrencyConversion().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoLocalCurrencyConversion().getText()) && (!(pantalla.getCampoLocalCurrencyConversion().getText().contains(",")));//bigDecimal
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoPointsTag().getText().length()>0;//string
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getCampoTypesCards().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoTypesCards().getText())  && (!(pantalla.getCampoTypesCards().getText().contains("."))) && (!(pantalla.getCampoTypesCards().getText().contains(",")));//int
    noErrorCampaignDTO=noErrorCampaignDTO && pantalla.getComentariosCampaignDTO().getText().length()>0;//string
    if (!(noErrorCampaignDTO)){
        setTxtSalida("Verifique los datos especificados en CampaignDTO");
    }
    return noErrorCampaignDTO;
}


    /**
     * @return the docCampaign
     */
    public Document getDocCampaign() {
        return docCampaign;
    }

    /**
     * @param docCampaign the docCampaign to set
     */
    public void setDocCampaign(Document docCampaign) {
        this.docCampaign = docCampaign;
    }

    /**
     * @return the idMayorCampaign
     */
    public int getIdMayorCampaign() {
        return idMayorCampaign;
    }

    /**
     * @param idMayorCampaign the idMayorCampaign to set
     */
    public void setIdMayorCampaign(int idMayorCampaign) {
        this.idMayorCampaign = idMayorCampaign;
    }

    /**
     * @return the nuevoCampaign
     */
    public boolean isNuevoCampaign() {
        return nuevoCampaign;
    }

    /**
     * @param nuevoCampaign the nuevoCampaign to set
     */
    public void setNuevoCampaign(boolean nuevoCampaign) {
        this.nuevoCampaign = nuevoCampaign;
    }

    /**
     * @return the modeloListaCampaign
     */
    public DefaultListModel getModeloListaCampaign() {
        return modeloListaCampaign;
    }

    /**
     * @param modeloListaCampaign the modeloListaCampaign to set
     */
    public void setModeloListaCampaign(DefaultListModel modeloListaCampaign) {
        this.modeloListaCampaign = modeloListaCampaign;
    }

    public String getTxtSalida() {
        return txtSalida;
        //vista.FormDTOs.getInstance().getTxtSalida();
    }

    /**
     * @param txtSalida the txtSalida to set
     */
    public void setTxtSalida(String txtSalida) {
        this.txtSalida = txtSalida;
        this.setChanged();
        notifyObservers();
        //vista.FormDTOs.getInstance().agregaTxtAsalida(txtSalida);
    }
}
    
    /*
public void CampaignCargaDatosSegunElegido() {
    Element e = obtieneCampaignElegido();
    if (e != null){
            getCampoAmountDaysExpiration().setText(e.getChildText("amountDaysExpiration"));
            getCampoAmountLastMovements().setText(e.getChildText("amountLastMovements"));
            getCampoAmountPrizes().setText(e.getChildText("amountPrizes"));
            getCampoCreditsTag().setText(e.getChildText("creditsTag")); 
/*      Element orders = e.getChild("orders");
        if (orders != null) {
            campoCriteria.setText(e.getChild("orders").getChildText("criteria"));    
            campoOrder.setText(e.getChild("orders").getChildText("order"));                
        }
        else {
            campoCriteria.setText("");    
            campoOrder.setText("");                
        }
*/ /*        
            getCampoDescriptionCampaign().setText(e.getChildText("description"));
            getCampoDirLogo().setText(e.getChildText("dirLogo"));
            getCampoNameCamp().setText(e.getChildText("name"));
            getCampoLocalCurrencyConversion().setText(e.getChildText("localCurrencyConversion"));
            getCampoPointsTag().setText(e.getChildText("pointsTag"));
            getCampoTypesCards().setText(e.getChildText("typesCards"));
        
            getComentariosCampaignDTO().setText(e.getAttributeValue("descripcion"));
    }
}
 * 
 getCampoAmountDaysExpiration().setText(e.getChildText("amountDaysExpiration"));
 getCampoAmountLastMovements().setText(e.getChildText("amountLastMovements"));
 getCampoAmountPrizes().setText(e.getChildText("amountPrizes"));
 getCampoCreditsTag().setText(e.getChildText("creditsTag"));
 getCampoDescriptionCampaign().setText(e.getChildText("description"));
 getCampoDirLogo().setText(e.getChildText("dirLogo"));
 getCampoNameCamp().setText(e.getChildText("name"));
 getCampoLocalCurrencyConversion().setText(e.getChildText("localCurrencyConversion"));
 getCampoPointsTag().setText(e.getChildText("pointsTag"));
 getCampoTypesCards().setText(e.getChildText("typesCards"));
 getComentariosCampaignDTO().setText(e.getAttributeValue("descripcion"));


 * 
*/